import { defineStore } from 'pinia';
import { login, logout, getInfo } from '@/api/login';
import { getToken, setToken, removeToken } from '@/utils/auth';
import defAva from '@/assets/images/profile.jpg';

/**
 * 用户信息 store
 */
const useUserStore = defineStore(
  'user',
  {
    state: () => ({
      token: getToken() as string,
      name: '' as string,
      avatar: '' as string,
      roles: [] as string[],
      permissions: [] as string[]
    }),
    actions: {
      /**
       * 用户登录
       * @param userInfo - 用户登录信息
       * @returns Promise<void>
       */
      login(userInfo: { username: string; password: string; code: string; uuid: string }): Promise<void> {
        const username = userInfo.username.trim();
        const password = userInfo.password;
        const code = userInfo.code;
        const uuid = userInfo.uuid;

        return new Promise((resolve, reject) => {
          login(username, password, code, uuid).then(res => {
            setToken(res.token);
            this.token = res.token;
            resolve();
          }).catch(error => {
            reject(error);
          });
        });
      },

      /**
       * 获取用户信息
       * @returns Promise<any>
       */
      getInfo(): Promise<any> {
        return new Promise((resolve, reject) => {
          getInfo().then(res => {
            const user = res.user;
            const avatar = (user.avatar == "" || user.avatar == null) ? defAva : import.meta.env.VITE_APP_BASE_API + user.avatar;

            if (res.roles && res.roles.length > 0) { // 验证返回的 roles 是否是一个非空数组
              this.roles = res.roles;
              this.permissions = res.permissions;
            } else {
              this.roles = ['ROLE_DEFAULT'];
            }

            this.name = user.userName;
            this.avatar = avatar;
            resolve(res);
          }).catch(error => {
            reject(error);
          });
        });
      },

      /**
       * 用户退出登录
       * @returns Promise<void>
       */
      logOut(): Promise<void> {
        return new Promise((resolve, reject) => {
          logout().then(() => {
            this.token = '';
            this.roles = [];
            this.permissions = [];
            removeToken();
            resolve();
          }).catch(error => {
            reject(error);
          });
        });
      }
    }
  });

export {useUserStore};